import axios from 'axios'
import {Message, MessageBox} from 'element-ui'
import store from '@/store'
import {getToken} from '@/utils/cookie'
import qs from 'qs'

const service = axios.create({
  baseURL: process.env.BASE_API,
  timeout: 5000,
})

service.interceptors.request.use(config => {
  // if (config.method === 'post') {
  //   config.data = qs.stringify(config.data);
  //   config.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
  // }

  if (store.getters.token) {
    config.headers['X-Token'] = getToken()
  }
  return config
}, err => {
  return Promise.reject(err)
})

service.interceptors.response.use(response => {
    const res = response.data;
    if (res && res.code && res.code !== 200) {
      if (res.msg) {
        Message({
          message: res.msg,
          type: 'error',
          duration: 5 * 1000
        })
      }
      if (res.code === 508 || res.code === 512 || res.code === 514) {
        //如果登录超时了，在数据中传递一个code参数，进入正常返回流程，再判断code码是否为登录超时码
        MessageBox.confirm('登录超时，可以取消继续留在该页面，或者重新登录', '提示', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
        }).then(() => {
          store.dispatch('FedLogOut').then(() => {
            location.reload() // 为了重新实例化vue-router对象 避免bug
          })
        })
      }
      return Promise.reject('error')
    } else {
      //如果没有code参数或返回参数中有code：200，就会正常返回数据，符合实际业务逻辑，
      if (res.msg) {
        Message({
          message: res.msg,
          duration: 3 * 1000
        })
      }
      return response
    }
  },
  err => {
    if (err && err.response) {
      switch (err.response.status) {
        case 400:
          err.message = '请求错误'
          break;
        case 401:
          err.message = '还未授权，请重新登录'
          break;
        case 403:
          err.message = '该请求不允许访问'
          break;
        case 404:
          err.message = '请求发生异常,未找到该资源'
          break;
        case 405:
          err.message = '该请求方法未被允许'
          break;
        case 408:
          err.message = '请求时间超时'
          break;
        case 500:
          err.message = '服务器出现异常，请稍后重试'
          break;
        case 501:
          err.message = '网络连接出现了异常，请稍后重试'
          break;
        case 502:
          err.message = '网络连接出现了异常，请稍后重试'
          break;
        case 503:
          err.message = '该服务现在不可用'
          break;
        case 504:
          err.message = '网络异常，连接超时'
          break;
        case 505:
          err.message = 'http版本不支持该请求'
          break;
        default:
          err.message = `连接错误${err.response.status}`
      }
    } else {
      err.message = "连接到服务器失败"
    }
    Message({
      message: err.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(err.message)
  })

export default service
